﻿#ifndef _C_MAINFRAME_H
#define _C_MAINFRAME_H

#include "common.h"
#include "network/networkframemanager.h"
#include "network/wtcpclient.h"
#include "network/whttpserver.h"
#include "network/wwebsocketserver.h"
#include "liblicense.h"

#include <mutex>          // 必须包含
#include <shared_mutex>   // 必须包含（C++17）

wxDECLARE_EVENT(DIR_CHANGED_EVENT, wxThreadEvent);

class CMainFrame : public wxFrame ,
                   public efsw::FileWatchListener ,
                   public NetworkFrameManager,
                   public Singleton<CMainFrame>
{
    DECLARE_EVENT_TABLE()

public:
    CMainFrame(const wxString& title,
               const wxPoint& pos = wxDefaultPosition,
               const wxSize& size = wxDefaultSize);
    ~CMainFrame();

    /// 打印日志
    void printlog(int level,std::string str,bool issave=true);
    /// 在状态栏上打印文本
    void printStatusBar(wxString msg);
    /// 加载指定的脚本文件
    void loadScriptFile(wxString filepath,const wxArtID& artid);
    /// 加载指定结点的脚本文件
    void loadNodeScriptFile(wxString nodepath);
    /// 打开信号服务器
    void openSignalServer(void);
    /// 得到当前工作模式
    inline WorkingMode getWorkingMode(void) { return m_WorkingMode; }

    /// 处理http消息
    virtual bool OnProcessHttpMessage(const WHttpRequest& request, WHttpResponse& response);
    /// 处理网络字符串消息
    virtual void OnWebSocketProcessNetText(WebSocketlientInfo* client,wxString mes);

private:
    void OnScriptChangedEvent(efsw::Action action,wxString dir,wxString fileName,wxString oldFilename);
    /// 加载系统初始脚本
    void loadInitSystemScript(void);
    /// 保存所有的文件
    void saveAllFiles(void);
    /// 切换工作模式
    void changeWorkingMode(void);

protected:
    void handleFileAction( efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename = "" );
    void OnDirChangedEvent(wxThreadEvent& event);
    void handlerBtnSaveAll(wxCommandEvent& event);
    void OnKeyDown(wxKeyEvent& event);
    void handlerNoteBookClose(wxAuiNotebookEvent& event);
    void OnAuiManagerPaneUpdated(wxAuiManagerEvent& event);
    void OnClose(wxCloseEvent& event);
    void OnMainFrameMenu(wxCommandEvent& event);
    void OnSystemInitTimer(wxTimerEvent& event);
    void OnScriptLoadTimer(wxTimerEvent& event);
    void OnAuthorizationCheckTimer(wxTimerEvent& event);

private:
    wxTimer *m_sysInitTimer;
    wxTimer* m_authorizationchecktimer;
    wxTimer* m_scriptLoadTimer;
    wxDateTime m_lastPopupTime;                        /**< 最后弹窗的时间 */
    wxString m_curScriptWorkingPath;                   /**< 当前脚本工作目录 */
    maindrawscene *m_maindrawscene;                    /**< 主绘制窗口 */
    wxRichTextCtrl* m_systemlogtextCtrl;               /**< 系统日志输出 */
    wxStatusBar* m_systemStatusBar;                    /**< 系统状态栏 */
    wxAuiManager m_auimgr;
    wxAuiNotebook *m_scirptAuiNotebooks;               /**< 脚本文件管理 */
    CLicense m_License;                                /**< 授权管理器 */
    std::map<wxString,wxString> m_inputFileMd5;        /**< 输入文件的md5 */
    WorkingMode m_WorkingMode;                         /**< 工作模式 */
    wxMenu *m_editMenu;
    WHttpServer m_HttpServer;                          /**< http服务器 */
    WWebSocketServer m_WebSocketServer;                /**< websocket服务器 */
    mutable std::mutex m_MainFrameMutex;
};

#endif // CMAINFRAME_H
